package com.liyang.shutdowhook;


import java.util.concurrent.TimeUnit;

/**
 * @author liyang
 * @version 1.0
 * @Title: HookTest
 * @description
 * JAVA虚拟机关闭钩子(Shutdown Hook)
 * Java程序经常也会遇到进程挂掉的情况，一些状态没有正确的保存下来，这时候就需要在JVM关掉的时候执行一些清理现场的代码。JAVA中的ShutdownHook提供了比较好的方案。
 *
 * JDK提供了Java.Runtime.addShutdownHook(Thread hook)方法，可以注册一个JVM关闭的钩子，这个钩子可以在一下几种场景中被调用：
 *
 * 1.程序正常退出
 * 2.使用System.exit()
 * 3.终端使用Ctrl+C触发的中断
 * 4.系统关闭
 * 5.OutOfMemory宕机
 * 6.使用Kill pid命令干掉进程（注：在使用kill -9 pid时，是不会被调用的）
 *
 * @date 2021/4/12 11:29
 */
public class HookTest {
    public void start() {
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Execute Hook.....");
            }
        }));
    }

    public static void main(String[] args) {
        new HookTest().start();
        System.out.println("The Application is doing something");

        try {
            TimeUnit.MILLISECONDS.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}